Load required libraries.

library(Seurat)
Registered S3 method overwritten by 'data.table':
  method           from
  print.data.table     
Registered S3 method overwritten by 'htmlwidgets':
  method           from         
  print.htmlwidget tools:rstudio
Registered S3 method overwritten by 'spatstat.geom':
  method     from
  print.boxx cli 
Attaching SeuratObject
Warning message:
R graphics engine version 14 is not supported by this version of RStudio. The Plots tab will be disabled until a newer version of RStudio is installed. 
library(tidyverse)
Registered S3 methods overwritten by 'dbplyr':
  method         from
  print.tbl_lazy     
  print.tbl_sql      
── Attaching packages ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── tidyverse 1.3.1 ──
✓ ggplot2 3.3.5     ✓ purrr   0.3.4
✓ tibble  3.1.6     ✓ dplyr   1.0.7
✓ tidyr   1.1.4     ✓ stringr 1.4.0
✓ readr   2.1.1     ✓ forcats 0.5.1
── Conflicts ─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── tidyverse_conflicts() ──
x dplyr::filter() masks stats::filter()
x dplyr::lag()    masks stats::lag()

Load Seurat object.

load("/Volumes/Bud_SSD/20210505-seurat/all-aggr-neighbors.Robj")

We settled on 5 clusters.

load("/Volumes/Bud_SSD/20210505-seurat/all-aggr-cluster-iters/cluster-per-cell-all-aggr-clust-5.Robj")
all.aggr$cluster <- all.aggr.active.ident
Idents(all.aggr) <- all.aggr.active.ident
tsne.whole <- data.frame(all.aggr@reductions$tsne@cell.embeddings, all.aggr$embryo.id, all.aggr$genotype, all.aggr$cluster)
colnames(tsne.whole) <- c("tsne.1", "tsne.2", "embryo.id", "genotype", "cluster")
head(tsne.whole)
tsne.whole$genotype <- factor(x = tsne.whole$genotype, levels = c("Flox", "FIN"))

Generate positions and labels for each cluster.

tsne.label <- tsne.whole %>% group_by(cluster) %>% summarize(tsne.1 = median(tsne.1), tsne.2 = median(tsne.2))

By genotype.

genotype.tsne <- ggplot() +
geom_point(data = sample(tsne.whole), mapping = aes(x = tsne.1, y = tsne.2, color = genotype), shape = 20, size = 1, stroke = 0, alpha = 1) +
    scale_color_manual(values = c("royalblue", "indianred"), labels = c("Nipbl Flox/+", "Nipbl FIN/+")) +
    guides(color = guide_legend(override.aes = list(size = 3.5))) +
labs(title = "Whole, Nipbl Flox/+ & FIN/+", x = "t-SNE 1", y = "t-SNE 2", color = "Genotype") +
theme_classic(base_size = 7) +
    theme(axis.line = element_blank(), axis.ticks = element_blank(), axis.text = element_blank(), legend.key.size = unit(7, "pt"), plot.title = element_text(hjust = 0.5))
genotype.tsne
ggsave(plot = genotype.tsne, filename = "/Volumes/Bud_SSD/20210505-seurat/tsne-by-genotype-all-aggr.png", device = "png", units = "in", width = 6.5, height = 4.5)

library(scales)

Attaching package: ‘scales’

The following object is masked from ‘package:purrr’:

    discard

The following object is masked from ‘package:readr’:

    col_factor

Get colors for each cluster. We need 11 colors.

show_col(hue_pal()(12))

hue_pal()(12)
 [1] "#F8766D" "#DE8C00" "#B79F00" "#7CAE00" "#00BA38" "#00C08B" "#00BFC4" "#00B4F0" "#619CFF" "#C77CFF" "#F564E3" "#FF64B0"

See within genotype.

flox.tsne <- ggplot() +
geom_point(data = sample(tsne.whole %>% filter(genotype == "Flox")), mapping = aes(x = tsne.1, y = tsne.2, color = embryo.id), shape = 20, size = 1, stroke = 0) +
    scale_color_manual(labels = c("EP1", "EP2", "EP3", "EP4", "EP5"), values = hue_pal()(12)[c(1, 7, 3, 9, 5)]) +
labs(title = "Whole, Nipbl Flox/+", x = "t-SNE 1", y = "t-SNE 2", color = "Embryo\nPair") +
    guides(color = guide_legend(override.aes = list(size = 3.5))) +
theme_classic(base_size = 7) +
    theme(axis.line = element_blank(), axis.ticks = element_blank(), axis.text = element_blank(), legend.key.size = unit(7, "pt"), plot.title = element_text(hjust = 0.5))
flox.tsne
ggsave(plot = flox.tsne, filename = "/Volumes/Bud_SSD/20210505-seurat/tsne-by-embryo-flox-all-aggr.png", device = "png", units = "in", width = 6.5, height = 4.5)

fin.tsne <- ggplot() +
geom_point(data = sample(tsne.whole %>% filter(genotype == "FIN")), mapping = aes(x = tsne.1, y = tsne.2, color = embryo.id), shape = 20, size = 1, stroke = 0) +
    scale_color_manual(labels = c("EP6", "EP7", "EP8", "EP9", "EP10", "EP11"), values = hue_pal()(12)[c(2, 8, 4, 10, 6, 12)]) +
labs(title = "Whole, Nipbl FIN/+", x = "t-SNE 1", y = "t-SNE 2", color = "Embryo\nPair") +
    guides(color = guide_legend(override.aes = list(size = 3.5))) +
theme_classic(base_size = 7) +
    theme(axis.line = element_blank(), axis.ticks = element_blank(), axis.text = element_blank(), legend.key.size = unit(7, "pt"), plot.title = element_text(hjust = 0.5))
fin.tsne
ggsave(plot = fin.tsne, filename = "/Volumes/Bud_SSD/20210505-seurat/tsne-by-embryo-fin-all-aggr.png", device = "png", units = "in", width = 6.5, height = 4.5)

Make new directory.

dir.create('/Volumes/Bud_SSD/20210505-seurat/all-aggr-clust-5')

tsne by cluster

cluster.tsne <- ggplot() +
geom_point(data = sample(tsne.whole), mapping = aes(x = tsne.1, y = tsne.2, color = cluster), shape = 20, size = 1, stroke = 0) +
    geom_text(data = tsne.label, mapping = aes(x = tsne.1, y = tsne.2, label = cluster), size = 3.5) +
labs(title = "Whole, Nipbl Flox/+ & FIN/+", x = "t-SNE 1", y = "t-SNE 2", color = "Cluster") +
    guides(color = guide_legend(override.aes = list(size = 3.5))) +
theme_classic(base_size = 7) +
    theme(axis.line = element_blank(), axis.ticks = element_blank(), axis.text = element_blank(), legend.key.size = unit(7, "pt"), plot.title = element_text(hjust = 0.5))
cluster.tsne
ggsave(plot = cluster.tsne, filename = "/Volumes/Bud_SSD/20210505-seurat/all-aggr-clust-5/tsne-by-cluster-all-aggr-clust-5.png", device = "png", units = "in", width = 6.5, height = 4.5)

Get colors for each cluster. We need 11 colors.

show_col(hue_pal()(5))

hue_pal()(5)
[1] "#F8766D" "#A3A500" "#00BF7D" "#00B0F6" "#E76BF3"

By genotype.

genotype.tsne <- ggplot() +
geom_point(data = sample(tsne.whole), mapping = aes(x = tsne.1, y = tsne.2, color = genotype), shape = 20, size = 1, stroke = 0, alpha = 1) +
    scale_color_manual(values = c("royalblue", "indianred"), labels = c("Nipbl Flox/+", "Nipbl FIN/+")) +
      geom_density_2d(data = tsne.whole %>% filter(cluster == 2), mapping = aes(x = tsne.1, y = tsne.2), color = "#A3A500", linetype = "solid", size = 1, contour_var = "count", breaks = 1) +
      geom_density_2d(data = tsne.whole %>% filter(cluster == 3), mapping = aes(x = tsne.1, y = tsne.2), color = "#00BF7D", linetype = "solid", size = 1, contour_var = "count", breaks = 1) +
      geom_label(data = tsne.label, mapping = aes(x = tsne.1, y = tsne.2, label = cluster, fill = cluster), size = 3.5) +
    guides(color = guide_legend(override.aes = list(size = 3.5))) +
labs(title = "Whole, Nipbl Flox/+ & FIN/+", x = "t-SNE 1", y = "t-SNE 2", color = "Genotype") +
    guides(fill = "none") +
theme_classic(base_size = 7) +
    theme(axis.line = element_blank(), axis.ticks = element_blank(), axis.text = element_blank(), legend.key.size = unit(7, "pt"), plot.title = element_text(hjust = 0.5))
genotype.tsne
ggsave(plot = genotype.tsne, filename = "/Volumes/Bud_SSD/20210505-seurat/all-aggr-clust-5/tsne-by-genotype-all-aggr-clust-5.png", device = "png", units = "in", width = 6.5, height = 4.5)

Upload object onto hpc.

scp /Volumes/Bud_SSD/20210505-seurat/tsne-by-genotype-all-aggr.png schea2@hpc3.rcic.uci.edu:/dfs6/pub/schea2/20210505-seurat

scp /Volumes/Bud_SSD/20210505-seurat/tsne-by-embryo-flox-all-aggr.png schea2@hpc3.rcic.uci.edu:/dfs6/pub/schea2/20210505-seurat

scp /Volumes/Bud_SSD/20210505-seurat/tsne-by-embryo-fin-all-aggr.png schea2@hpc3.rcic.uci.edu:/dfs6/pub/schea2/20210505-seurat

scp /Volumes/Bud_SSD/20210505-seurat/all-aggr-clust-5/tsne-by-cluster-all-aggr-clust-5.png schea2@hpc3.rcic.uci.edu:/dfs6/pub/schea2/20210505-seurat/all-aggr-clust-5

scp /Volumes/Bud_SSD/20210505-seurat/all-aggr-clust-5/tsne-by-genotype-all-aggr-clust-5.png schea2@hpc3.rcic.uci.edu:/dfs6/pub/schea2/20210505-seurat/all-aggr-clust-5
save(object = all.aggr, file = "/Volumes/Bud_SSD/20210505-seurat/all-aggr-clust-5/all-aggr-clust-5.Robj")
Warning messages:
1: In readChar(file, size, TRUE) : truncating string with embedded nuls
2: In readChar(file, size, TRUE) : truncating string with embedded nuls
3: In readChar(file, size, TRUE) : truncating string with embedded nuls
4: In readChar(file, size, TRUE) : truncating string with embedded nuls
5: In readChar(file, size, TRUE) : truncating string with embedded nuls
6: In readChar(file, size, TRUE) : truncating string with embedded nuls
7: In readChar(file, size, TRUE) : truncating string with embedded nuls

Upload object onto hpc.

scp /Volumes/Bud_SSD/20210505-seurat/all-aggr-clust-5/all-aggr-clust-5.Robj schea2@hpc3.rcic.uci.edu:/dfs6/pub/schea2/20210505-seurat/all-aggr-clust-5
LS0tCnRpdGxlOiAiU2V0IG51bWJlciBvZiBjbHVzdGVycyIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKTG9hZCByZXF1aXJlZCBsaWJyYXJpZXMuCmBgYHtyfQpsaWJyYXJ5KFNldXJhdCkKbGlicmFyeSh0aWR5dmVyc2UpCmBgYAoKTG9hZCBTZXVyYXQgb2JqZWN0LgpgYGB7cn0KbG9hZCgiL1ZvbHVtZXMvQnVkX1NTRC8yMDIxMDUwNS1zZXVyYXQvYWxsLWFnZ3ItbmVpZ2hib3JzLlJvYmoiKQpgYGAKCldlIHNldHRsZWQgb24gNSBjbHVzdGVycy4KYGBge3J9CmxvYWQoIi9Wb2x1bWVzL0J1ZF9TU0QvMjAyMTA1MDUtc2V1cmF0L2FsbC1hZ2dyLWNsdXN0ZXItaXRlcnMvY2x1c3Rlci1wZXItY2VsbC1hbGwtYWdnci1jbHVzdC01LlJvYmoiKQphbGwuYWdnciRjbHVzdGVyIDwtIGFsbC5hZ2dyLmFjdGl2ZS5pZGVudApJZGVudHMoYWxsLmFnZ3IpIDwtIGFsbC5hZ2dyLmFjdGl2ZS5pZGVudApgYGAKCmBgYHtyfQp0c25lLndob2xlIDwtIGRhdGEuZnJhbWUoYWxsLmFnZ3JAcmVkdWN0aW9ucyR0c25lQGNlbGwuZW1iZWRkaW5ncywgYWxsLmFnZ3IkZW1icnlvLmlkLCBhbGwuYWdnciRnZW5vdHlwZSwgYWxsLmFnZ3IkY2x1c3RlcikKY29sbmFtZXModHNuZS53aG9sZSkgPC0gYygidHNuZS4xIiwgInRzbmUuMiIsICJlbWJyeW8uaWQiLCAiZ2Vub3R5cGUiLCAiY2x1c3RlciIpCmhlYWQodHNuZS53aG9sZSkKYGBgCgpgYGB7cn0KdHNuZS53aG9sZSRnZW5vdHlwZSA8LSBmYWN0b3IoeCA9IHRzbmUud2hvbGUkZ2Vub3R5cGUsIGxldmVscyA9IGMoIkZsb3giLCAiRklOIikpCmBgYAoKR2VuZXJhdGUgcG9zaXRpb25zIGFuZCBsYWJlbHMgZm9yIGVhY2ggY2x1c3Rlci4KYGBge3J9CnRzbmUubGFiZWwgPC0gdHNuZS53aG9sZSAlPiUgZ3JvdXBfYnkoY2x1c3RlcikgJT4lIHN1bW1hcml6ZSh0c25lLjEgPSBtZWRpYW4odHNuZS4xKSwgdHNuZS4yID0gbWVkaWFuKHRzbmUuMikpCmBgYAoKQnkgZ2Vub3R5cGUuCmBgYHtyfQpnZW5vdHlwZS50c25lIDwtIGdncGxvdCgpICsKZ2VvbV9wb2ludChkYXRhID0gc2FtcGxlKHRzbmUud2hvbGUpLCBtYXBwaW5nID0gYWVzKHggPSB0c25lLjEsIHkgPSB0c25lLjIsIGNvbG9yID0gZ2Vub3R5cGUpLCBzaGFwZSA9IDIwLCBzaXplID0gMSwgc3Ryb2tlID0gMCwgYWxwaGEgPSAxKSArCiAgICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygicm95YWxibHVlIiwgImluZGlhbnJlZCIpLCBsYWJlbHMgPSBjKCJOaXBibCBGbG94LysiLCAiTmlwYmwgRklOLysiKSkgKwogICAgZ3VpZGVzKGNvbG9yID0gZ3VpZGVfbGVnZW5kKG92ZXJyaWRlLmFlcyA9IGxpc3Qoc2l6ZSA9IDMuNSkpKSArCmxhYnModGl0bGUgPSAiV2hvbGUsIE5pcGJsIEZsb3gvKyAmIEZJTi8rIiwgeCA9ICJ0LVNORSAxIiwgeSA9ICJ0LVNORSAyIiwgY29sb3IgPSAiR2Vub3R5cGUiKSArCnRoZW1lX2NsYXNzaWMoYmFzZV9zaXplID0gNykgKwogICAgdGhlbWUoYXhpcy5saW5lID0gZWxlbWVudF9ibGFuaygpLCBheGlzLnRpY2tzID0gZWxlbWVudF9ibGFuaygpLCBheGlzLnRleHQgPSBlbGVtZW50X2JsYW5rKCksIGxlZ2VuZC5rZXkuc2l6ZSA9IHVuaXQoNywgInB0IiksIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKQoKZ2Vub3R5cGUudHNuZQoKZ2dzYXZlKHBsb3QgPSBnZW5vdHlwZS50c25lLCBmaWxlbmFtZSA9ICIvVm9sdW1lcy9CdWRfU1NELzIwMjEwNTA1LXNldXJhdC90c25lLWJ5LWdlbm90eXBlLWFsbC1hZ2dyLnBuZyIsIGRldmljZSA9ICJwbmciLCB1bml0cyA9ICJpbiIsIHdpZHRoID0gNi41LCBoZWlnaHQgPSA0LjUpCmBgYAoKYGBge3J9CmxpYnJhcnkoc2NhbGVzKQpgYGAKCkdldCBjb2xvcnMgZm9yIGVhY2ggY2x1c3Rlci4gV2UgbmVlZCAxMSBjb2xvcnMuCmBgYHtyfQpzaG93X2NvbChodWVfcGFsKCkoMTIpKQpodWVfcGFsKCkoMTIpCmBgYAoKU2VlIHdpdGhpbiBnZW5vdHlwZS4KYGBge3J9CmZsb3gudHNuZSA8LSBnZ3Bsb3QoKSArCmdlb21fcG9pbnQoZGF0YSA9IHNhbXBsZSh0c25lLndob2xlICU+JSBmaWx0ZXIoZ2Vub3R5cGUgPT0gIkZsb3giKSksIG1hcHBpbmcgPSBhZXMoeCA9IHRzbmUuMSwgeSA9IHRzbmUuMiwgY29sb3IgPSBlbWJyeW8uaWQpLCBzaGFwZSA9IDIwLCBzaXplID0gMSwgc3Ryb2tlID0gMCkgKwogICAgc2NhbGVfY29sb3JfbWFudWFsKGxhYmVscyA9IGMoIkVQMSIsICJFUDIiLCAiRVAzIiwgIkVQNCIsICJFUDUiKSwgdmFsdWVzID0gaHVlX3BhbCgpKDEyKVtjKDEsIDcsIDMsIDksIDUpXSkgKwpsYWJzKHRpdGxlID0gIldob2xlLCBOaXBibCBGbG94LysiLCB4ID0gInQtU05FIDEiLCB5ID0gInQtU05FIDIiLCBjb2xvciA9ICJFbWJyeW9cblBhaXIiKSArCiAgICBndWlkZXMoY29sb3IgPSBndWlkZV9sZWdlbmQob3ZlcnJpZGUuYWVzID0gbGlzdChzaXplID0gMy41KSkpICsKdGhlbWVfY2xhc3NpYyhiYXNlX3NpemUgPSA3KSArCiAgICB0aGVtZShheGlzLmxpbmUgPSBlbGVtZW50X2JsYW5rKCksIGF4aXMudGlja3MgPSBlbGVtZW50X2JsYW5rKCksIGF4aXMudGV4dCA9IGVsZW1lbnRfYmxhbmsoKSwgbGVnZW5kLmtleS5zaXplID0gdW5pdCg3LCAicHQiKSwgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpCgpmbG94LnRzbmUKCmdnc2F2ZShwbG90ID0gZmxveC50c25lLCBmaWxlbmFtZSA9ICIvVm9sdW1lcy9CdWRfU1NELzIwMjEwNTA1LXNldXJhdC90c25lLWJ5LWVtYnJ5by1mbG94LWFsbC1hZ2dyLnBuZyIsIGRldmljZSA9ICJwbmciLCB1bml0cyA9ICJpbiIsIHdpZHRoID0gNi41LCBoZWlnaHQgPSA0LjUpCmBgYAoKYGBge3J9CmZpbi50c25lIDwtIGdncGxvdCgpICsKZ2VvbV9wb2ludChkYXRhID0gc2FtcGxlKHRzbmUud2hvbGUgJT4lIGZpbHRlcihnZW5vdHlwZSA9PSAiRklOIikpLCBtYXBwaW5nID0gYWVzKHggPSB0c25lLjEsIHkgPSB0c25lLjIsIGNvbG9yID0gZW1icnlvLmlkKSwgc2hhcGUgPSAyMCwgc2l6ZSA9IDEsIHN0cm9rZSA9IDApICsKICAgIHNjYWxlX2NvbG9yX21hbnVhbChsYWJlbHMgPSBjKCJFUDYiLCAiRVA3IiwgIkVQOCIsICJFUDkiLCAiRVAxMCIsICJFUDExIiksIHZhbHVlcyA9IGh1ZV9wYWwoKSgxMilbYygyLCA4LCA0LCAxMCwgNiwgMTIpXSkgKwpsYWJzKHRpdGxlID0gIldob2xlLCBOaXBibCBGSU4vKyIsIHggPSAidC1TTkUgMSIsIHkgPSAidC1TTkUgMiIsIGNvbG9yID0gIkVtYnJ5b1xuUGFpciIpICsKICAgIGd1aWRlcyhjb2xvciA9IGd1aWRlX2xlZ2VuZChvdmVycmlkZS5hZXMgPSBsaXN0KHNpemUgPSAzLjUpKSkgKwp0aGVtZV9jbGFzc2ljKGJhc2Vfc2l6ZSA9IDcpICsKICAgIHRoZW1lKGF4aXMubGluZSA9IGVsZW1lbnRfYmxhbmsoKSwgYXhpcy50aWNrcyA9IGVsZW1lbnRfYmxhbmsoKSwgYXhpcy50ZXh0ID0gZWxlbWVudF9ibGFuaygpLCBsZWdlbmQua2V5LnNpemUgPSB1bml0KDcsICJwdCIpLCBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkKCmZpbi50c25lCgpnZ3NhdmUocGxvdCA9IGZpbi50c25lLCBmaWxlbmFtZSA9ICIvVm9sdW1lcy9CdWRfU1NELzIwMjEwNTA1LXNldXJhdC90c25lLWJ5LWVtYnJ5by1maW4tYWxsLWFnZ3IucG5nIiwgZGV2aWNlID0gInBuZyIsIHVuaXRzID0gImluIiwgd2lkdGggPSA2LjUsIGhlaWdodCA9IDQuNSkKYGBgCgpNYWtlIG5ldyBkaXJlY3RvcnkuCmBgYHtyfQpkaXIuY3JlYXRlKCcvVm9sdW1lcy9CdWRfU1NELzIwMjEwNTA1LXNldXJhdC9hbGwtYWdnci1jbHVzdC01JykKYGBgCgoKdHNuZSBieSBjbHVzdGVyCmBgYHtyfQpjbHVzdGVyLnRzbmUgPC0gZ2dwbG90KCkgKwpnZW9tX3BvaW50KGRhdGEgPSBzYW1wbGUodHNuZS53aG9sZSksIG1hcHBpbmcgPSBhZXMoeCA9IHRzbmUuMSwgeSA9IHRzbmUuMiwgY29sb3IgPSBjbHVzdGVyKSwgc2hhcGUgPSAyMCwgc2l6ZSA9IDEsIHN0cm9rZSA9IDApICsKICAgIGdlb21fdGV4dChkYXRhID0gdHNuZS5sYWJlbCwgbWFwcGluZyA9IGFlcyh4ID0gdHNuZS4xLCB5ID0gdHNuZS4yLCBsYWJlbCA9IGNsdXN0ZXIpLCBzaXplID0gMy41KSArCmxhYnModGl0bGUgPSAiV2hvbGUsIE5pcGJsIEZsb3gvKyAmIEZJTi8rIiwgeCA9ICJ0LVNORSAxIiwgeSA9ICJ0LVNORSAyIiwgY29sb3IgPSAiQ2x1c3RlciIpICsKICAgIGd1aWRlcyhjb2xvciA9IGd1aWRlX2xlZ2VuZChvdmVycmlkZS5hZXMgPSBsaXN0KHNpemUgPSAzLjUpKSkgKwp0aGVtZV9jbGFzc2ljKGJhc2Vfc2l6ZSA9IDcpICsKICAgIHRoZW1lKGF4aXMubGluZSA9IGVsZW1lbnRfYmxhbmsoKSwgYXhpcy50aWNrcyA9IGVsZW1lbnRfYmxhbmsoKSwgYXhpcy50ZXh0ID0gZWxlbWVudF9ibGFuaygpLCBsZWdlbmQua2V5LnNpemUgPSB1bml0KDcsICJwdCIpLCBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkKCmNsdXN0ZXIudHNuZQoKZ2dzYXZlKHBsb3QgPSBjbHVzdGVyLnRzbmUsIGZpbGVuYW1lID0gIi9Wb2x1bWVzL0J1ZF9TU0QvMjAyMTA1MDUtc2V1cmF0L2FsbC1hZ2dyLWNsdXN0LTUvdHNuZS1ieS1jbHVzdGVyLWFsbC1hZ2dyLWNsdXN0LTUucG5nIiwgZGV2aWNlID0gInBuZyIsIHVuaXRzID0gImluIiwgd2lkdGggPSA2LjUsIGhlaWdodCA9IDQuNSkKYGBgCgoKR2V0IGNvbG9ycyBmb3IgZWFjaCBjbHVzdGVyLiBXZSBuZWVkIDExIGNvbG9ycy4KYGBge3J9CnNob3dfY29sKGh1ZV9wYWwoKSg1KSkKaHVlX3BhbCgpKDUpCmBgYAoKQnkgZ2Vub3R5cGUuCmBgYHtyfQpnZW5vdHlwZS50c25lIDwtIGdncGxvdCgpICsKZ2VvbV9wb2ludChkYXRhID0gc2FtcGxlKHRzbmUud2hvbGUpLCBtYXBwaW5nID0gYWVzKHggPSB0c25lLjEsIHkgPSB0c25lLjIsIGNvbG9yID0gZ2Vub3R5cGUpLCBzaGFwZSA9IDIwLCBzaXplID0gMSwgc3Ryb2tlID0gMCwgYWxwaGEgPSAxKSArCiAgICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygicm95YWxibHVlIiwgImluZGlhbnJlZCIpLCBsYWJlbHMgPSBjKCJOaXBibCBGbG94LysiLCAiTmlwYmwgRklOLysiKSkgKwogICAgICBnZW9tX2RlbnNpdHlfMmQoZGF0YSA9IHRzbmUud2hvbGUgJT4lIGZpbHRlcihjbHVzdGVyID09IDIpLCBtYXBwaW5nID0gYWVzKHggPSB0c25lLjEsIHkgPSB0c25lLjIpLCBjb2xvciA9ICIjQTNBNTAwIiwgbGluZXR5cGUgPSAic29saWQiLCBzaXplID0gMSwgY29udG91cl92YXIgPSAiY291bnQiLCBicmVha3MgPSAxKSArCiAgICAgIGdlb21fZGVuc2l0eV8yZChkYXRhID0gdHNuZS53aG9sZSAlPiUgZmlsdGVyKGNsdXN0ZXIgPT0gMyksIG1hcHBpbmcgPSBhZXMoeCA9IHRzbmUuMSwgeSA9IHRzbmUuMiksIGNvbG9yID0gIiMwMEJGN0QiLCBsaW5ldHlwZSA9ICJzb2xpZCIsIHNpemUgPSAxLCBjb250b3VyX3ZhciA9ICJjb3VudCIsIGJyZWFrcyA9IDEpICsKICAgICAgZ2VvbV9sYWJlbChkYXRhID0gdHNuZS5sYWJlbCwgbWFwcGluZyA9IGFlcyh4ID0gdHNuZS4xLCB5ID0gdHNuZS4yLCBsYWJlbCA9IGNsdXN0ZXIsIGZpbGwgPSBjbHVzdGVyKSwgc2l6ZSA9IDMuNSkgKwogICAgZ3VpZGVzKGNvbG9yID0gZ3VpZGVfbGVnZW5kKG92ZXJyaWRlLmFlcyA9IGxpc3Qoc2l6ZSA9IDMuNSkpKSArCmxhYnModGl0bGUgPSAiV2hvbGUsIE5pcGJsIEZsb3gvKyAmIEZJTi8rIiwgeCA9ICJ0LVNORSAxIiwgeSA9ICJ0LVNORSAyIiwgY29sb3IgPSAiR2Vub3R5cGUiKSArCiAgICBndWlkZXMoZmlsbCA9ICJub25lIikgKwp0aGVtZV9jbGFzc2ljKGJhc2Vfc2l6ZSA9IDcpICsKICAgIHRoZW1lKGF4aXMubGluZSA9IGVsZW1lbnRfYmxhbmsoKSwgYXhpcy50aWNrcyA9IGVsZW1lbnRfYmxhbmsoKSwgYXhpcy50ZXh0ID0gZWxlbWVudF9ibGFuaygpLCBsZWdlbmQua2V5LnNpemUgPSB1bml0KDcsICJwdCIpLCBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkKCmdlbm90eXBlLnRzbmUKCmdnc2F2ZShwbG90ID0gZ2Vub3R5cGUudHNuZSwgZmlsZW5hbWUgPSAiL1ZvbHVtZXMvQnVkX1NTRC8yMDIxMDUwNS1zZXVyYXQvYWxsLWFnZ3ItY2x1c3QtNS90c25lLWJ5LWdlbm90eXBlLWFsbC1hZ2dyLWNsdXN0LTUucG5nIiwgZGV2aWNlID0gInBuZyIsIHVuaXRzID0gImluIiwgd2lkdGggPSA2LjUsIGhlaWdodCA9IDQuNSkKYGBgCgpVcGxvYWQgb2JqZWN0IG9udG8gaHBjLgpgYGB7YmFzaH0Kc2NwIC9Wb2x1bWVzL0J1ZF9TU0QvMjAyMTA1MDUtc2V1cmF0L3RzbmUtYnktZ2Vub3R5cGUtYWxsLWFnZ3IucG5nIHNjaGVhMkBocGMzLnJjaWMudWNpLmVkdTovZGZzNi9wdWIvc2NoZWEyLzIwMjEwNTA1LXNldXJhdAoKc2NwIC9Wb2x1bWVzL0J1ZF9TU0QvMjAyMTA1MDUtc2V1cmF0L3RzbmUtYnktZW1icnlvLWZsb3gtYWxsLWFnZ3IucG5nIHNjaGVhMkBocGMzLnJjaWMudWNpLmVkdTovZGZzNi9wdWIvc2NoZWEyLzIwMjEwNTA1LXNldXJhdAoKc2NwIC9Wb2x1bWVzL0J1ZF9TU0QvMjAyMTA1MDUtc2V1cmF0L3RzbmUtYnktZW1icnlvLWZpbi1hbGwtYWdnci5wbmcgc2NoZWEyQGhwYzMucmNpYy51Y2kuZWR1Oi9kZnM2L3B1Yi9zY2hlYTIvMjAyMTA1MDUtc2V1cmF0CgpzY3AgL1ZvbHVtZXMvQnVkX1NTRC8yMDIxMDUwNS1zZXVyYXQvYWxsLWFnZ3ItY2x1c3QtNS90c25lLWJ5LWNsdXN0ZXItYWxsLWFnZ3ItY2x1c3QtNS5wbmcgc2NoZWEyQGhwYzMucmNpYy51Y2kuZWR1Oi9kZnM2L3B1Yi9zY2hlYTIvMjAyMTA1MDUtc2V1cmF0L2FsbC1hZ2dyLWNsdXN0LTUKCnNjcCAvVm9sdW1lcy9CdWRfU1NELzIwMjEwNTA1LXNldXJhdC9hbGwtYWdnci1jbHVzdC01L3RzbmUtYnktZ2Vub3R5cGUtYWxsLWFnZ3ItY2x1c3QtNS5wbmcgc2NoZWEyQGhwYzMucmNpYy51Y2kuZWR1Oi9kZnM2L3B1Yi9zY2hlYTIvMjAyMTA1MDUtc2V1cmF0L2FsbC1hZ2dyLWNsdXN0LTUKYGBgCgpgYGB7cn0Kc2F2ZShvYmplY3QgPSBhbGwuYWdnciwgZmlsZSA9ICIvVm9sdW1lcy9CdWRfU1NELzIwMjEwNTA1LXNldXJhdC9hbGwtYWdnci1jbHVzdC01L2FsbC1hZ2dyLWNsdXN0LTUuUm9iaiIpCmBgYAoKVXBsb2FkIG9iamVjdCBvbnRvIGhwYy4KYGBge2Jhc2h9CnNjcCAvVm9sdW1lcy9CdWRfU1NELzIwMjEwNTA1LXNldXJhdC9hbGwtYWdnci1jbHVzdC01L2FsbC1hZ2dyLWNsdXN0LTUuUm9iaiBzY2hlYTJAaHBjMy5yY2ljLnVjaS5lZHU6L2RmczYvcHViL3NjaGVhMi8yMDIxMDUwNS1zZXVyYXQvYWxsLWFnZ3ItY2x1c3QtNQpgYGAKCgoK